import { BTState } from "../BTState";
import { BTComposite } from "./BTComposite";

/**
 * [行为树]并行选择节点
 * 并行选择节点将同时运行每个子节点
 * 直到一个子节点返回成功，则并行选择节点返回成功
 * 所有子节点都返回失败，则并行选择节点返回失败
 * 否则将继续运行下去
 */
export class BTParallelSelector<T = any> extends BTComposite<T>{

    process(ctx: T): BTState {
        let allFail = true;
        if (this.children.some(child => {
            child.tick(ctx);

            // 任何一个子节点成功了，代表并行选择节点成功了
            if (child.state === BTState.succ) {
                return true;
            }

            // 还有子节点没有失败，并行选择节点还没完成
            if (child.state !== BTState.fail) {
                allFail = false;
            }
        })) {
            return BTState.succ;
        }

        if (allFail) {
            return BTState.fail;
        }

        return BTState.run;
    }

}